{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b84ba346-d1a6-455c-83b5-35c05caf5d2e",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Gated PixelCNN\n",
    "PixelCNN is an autoregressive likelihood model for the task of image modeling, and Gated PixelCNN is an improved version, which uses GatedMaskedConv.\n",
    "\n",
    "### Reference\n",
    "- https://keras.io/examples/generative/pixelcnn/\n",
    "- Pixel Recurrent Neural Networks: https://arxiv.org/abs/1601.06759\n",
    "- Conditional Image Generation with PixelCNN Decoders: https://arxiv.org/abs/1606.05328\n",
    "- https://uvadlc-notebooks.readthedocs.io/en/latest/tutorial_notebooks/tutorial12/Autoregressive_Image_Modeling.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "2c3a2b17-6ff5-4e12-917b-47c4d6e2b546",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from torchvision import datasets, transforms\n",
    "from sklearn.manifold import TSNE\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "30492a43-b283-49a1-8fa0-b8d040203436",
   "metadata": {},
   "outputs": [],
   "source": [
    "class MaskedConv2d(nn.Conv2d):\n",
    "    \"\"\"\n",
    "    Implements a conv2d with mask applied on its weights.\n",
    "    \n",
    "    Args:\n",
    "        mask (torch.Tensor): the mask tensor.\n",
    "        in_channels (int) – Number of channels in the input image.\n",
    "        out_channels (int) – Number of channels produced by the convolution.\n",
    "        kernel_size (int or tuple) – Size of the convolving kernel\n",
    "    \"\"\"\n",
    "    \n",
    "    def __init__(self, mask, in_channels, out_channels, kernel_size, **kwargs):\n",
    "        super().__init__(in_channels, out_channels, kernel_size, **kwargs)\n",
    "        self.register_buffer('mask', mask[None, None])\n",
    "        \n",
    "    def forward(self, x):\n",
    "        self.weight.data *= self.mask # mask weights\n",
    "        return super().forward(x)\n",
    "    \n",
    "\n",
    "class VerticalStackConv(MaskedConv2d):\n",
    "\n",
    "    def __init__(self, mask_type, in_channels, out_channels, kernel_size, **kwargs):\n",
    "        # Mask out all pixels below. For efficiency, we could also reduce the kernel\n",
    "        # size in height (k//2, k), but for simplicity, we stick with masking here.\n",
    "        self.mask_type = mask_type\n",
    "        \n",
    "        if isinstance(kernel_size, int):\n",
    "            kernel_size = (kernel_size, kernel_size)\n",
    "        mask = torch.zeros(kernel_size)\n",
    "        mask[:kernel_size[0]//2, :] = 1.0\n",
    "        if self.mask_type == \"B\":\n",
    "            mask[kernel_size[0]//2, :] = 1.0\n",
    "\n",
    "        super().__init__(mask, in_channels, out_channels, kernel_size, **kwargs)\n",
    "        \n",
    "\n",
    "class HorizontalStackConv(MaskedConv2d):\n",
    "\n",
    "    def __init__(self, mask_type, in_channels, out_channels, kernel_size, **kwargs):\n",
    "        # Mask out all pixels on the left. Note that our kernel has a size of 1\n",
    "        # in height because we only look at the pixel in the same row.\n",
    "        self.mask_type = mask_type\n",
    "        \n",
    "        if isinstance(kernel_size, int):\n",
    "            kernel_size = (1, kernel_size)\n",
    "        assert kernel_size[0] == 1\n",
    "        if \"padding\" in kwargs:\n",
    "            if isinstance(kwargs[\"padding\"], int):\n",
    "                kwargs[\"padding\"] = (0, kwargs[\"padding\"])\n",
    "        \n",
    "        mask = torch.zeros(kernel_size)\n",
    "        mask[:, :kernel_size[1]//2] = 1.0\n",
    "        if self.mask_type == \"B\":\n",
    "            mask[:, kernel_size[1]//2] = 1.0\n",
    "\n",
    "        super().__init__(mask, in_channels, out_channels, kernel_size, **kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9737e47a-cf9c-46ae-9af2-1841e00d92cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize the receptive field for VerticalStackConv and HorizontalStackConv\n",
    "# we can compute the gradients of the input to imshow the receptive field\n",
    "\n",
    "inp_img = torch.zeros(1, 1, 11, 11)\n",
    "inp_img.requires_grad_()\n",
    "\n",
    "def show_center_recep_field(img, out):\n",
    "    \"\"\"\n",
    "    Calculates the gradients of the input with respect to the output center pixel,\n",
    "    and visualizes the overall receptive field.\n",
    "    Inputs:\n",
    "        img - Input image for which we want to calculate the receptive field on.\n",
    "        out - Output features/loss which is used for backpropagation, and should be\n",
    "              the output of the network/computation graph.\n",
    "    \"\"\"\n",
    "    # Determine gradients, the center pixel\n",
    "    loss = out[0, :, img.shape[2]//2, img.shape[3]//2].sum() # L1 loss for simplicity\n",
    "    # Retain graph as we want to stack multiple layers and show the receptive field of all of them\n",
    "    loss.backward(retain_graph=True)\n",
    "    img_grads = img.grad.abs()\n",
    "    img.grad.fill_(0) # Reset grads\n",
    "\n",
    "    # Plot receptive field\n",
    "    img = img_grads.squeeze().cpu().numpy()\n",
    "    fig, ax = plt.subplots(1, 2)\n",
    "    pos = ax[0].imshow(img)\n",
    "    ax[1].imshow(img > 0)\n",
    "    # Mark the center pixel in red if it doesn't have any gradients,\n",
    "    # which is the case for standard autoregressive models)\n",
    "    show_center = (img[img.shape[0]//2, img.shape[1]//2] == 0)\n",
    "    if show_center:\n",
    "        center_pixel = np.zeros(img.shape + (4,))\n",
    "        center_pixel[center_pixel.shape[0]//2, center_pixel.shape[1]//2, :] = np.array([1.0, 0.0, 0.0, 1.0])\n",
    "    for i in range(2):\n",
    "        ax[i].axis('off')\n",
    "        if show_center:\n",
    "            ax[i].imshow(center_pixel)\n",
    "    ax[0].set_title(\"Weighted receptive field\")\n",
    "    ax[1].set_title(\"Binary receptive field\")\n",
    "    plt.show()\n",
    "    plt.close()\n",
    "\n",
    "# we don't use conv, so the receptive field is only the center pixel\n",
    "show_center_recep_field(inp_img, inp_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "db55b418-374a-474e-8d1d-1054ffcdec10",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# we first visualize the original masked_conv\n",
    "kernel_size = 3\n",
    "mask_A = torch.zeros((3, 3))\n",
    "mask_A[:kernel_size//2, :] = 1.0\n",
    "mask_A[kernel_size//2, :kernel_size//2] = 1.0\n",
    "\n",
    "masked_conv = MaskedConv2d(mask_A, 1, 1, 3, padding=1)\n",
    "masked_conv.weight.data.fill_(1)\n",
    "masked_conv.bias.data.fill_(0)\n",
    "masked_conv_img = masked_conv(inp_img)\n",
    "show_center_recep_field(inp_img, masked_conv_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6dc8751a-477d-4aad-981d-ceb69e564817",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 2\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 4\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# use mask_type B\n",
    "mask_B = mask_A.clone()\n",
    "mask_B[kernel_size//2, kernel_size//2] = 1.\n",
    "masked_conv = MaskedConv2d(mask_B, 1, 1, 3, padding=1)\n",
    "masked_conv.weight.data.fill_(1)\n",
    "masked_conv.bias.data.fill_(0)\n",
    "\n",
    "for l_idx in range(4):\n",
    "    masked_conv_img = masked_conv(masked_conv_img)\n",
    "    print(f\"Layer {l_idx+2}\")\n",
    "    show_center_recep_field(inp_img, masked_conv_img)\n",
    "    \n",
    "# there is a “blind spot” on the right upper side"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e86370d9-7a9a-4576-9239-86e5403c0dc8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize HorizontalStackConv\n",
    "horiz_conv = HorizontalStackConv(\"A\", 1, 1, 3, padding=1)\n",
    "horiz_conv.weight.data.fill_(1)\n",
    "horiz_conv.bias.data.fill_(0)\n",
    "horiz_img = horiz_conv(inp_img)\n",
    "show_center_recep_field(inp_img, horiz_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "17e043b4-6423-43ed-8b38-ce0145eb3a53",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize VerticalStackConv\n",
    "vert_conv = VerticalStackConv(\"A\", 1, 1, 3, padding=1)\n",
    "vert_conv.weight.data.fill_(1)\n",
    "vert_conv.bias.data.fill_(0)\n",
    "vert_img = vert_conv(inp_img)\n",
    "show_center_recep_field(inp_img, vert_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "23a67b73-2d63-4e04-8179-5ab6056214c2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# combine the two by adding, which is what we expect\n",
    "horiz_img = vert_img + horiz_img\n",
    "show_center_recep_field(inp_img, horiz_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "00cfe67a-6312-4609-9e96-c597dc9dab5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 2\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 4\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Layer 5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Initialize convolutions with equal weight to all input pixels\n",
    "horiz_conv = HorizontalStackConv(\"B\", 1, 1, 3, padding=1)\n",
    "horiz_conv.weight.data.fill_(1)\n",
    "horiz_conv.bias.data.fill_(0)\n",
    "vert_conv = VerticalStackConv(\"B\", 1, 1, 3, padding=1)\n",
    "vert_conv.weight.data.fill_(1)\n",
    "vert_conv.bias.data.fill_(0)\n",
    "\n",
    "# note we use mask_type A for the first layer, but after first layer we should use mask_type B\n",
    "\n",
    "# We reuse our convolutions for the 4 layers here. Note that in a standard network,\n",
    "# we don't do that, and instead learn 4 separate convolution. As this cell is only for\n",
    "# visualization purposes, we reuse the convolutions for all layers.\n",
    "for l_idx in range(4):\n",
    "    vert_img = vert_conv(vert_img)\n",
    "    horiz_img = horiz_conv(horiz_img) + vert_img\n",
    "    print(f\"Layer {l_idx+2}\")\n",
    "    show_center_recep_field(inp_img, horiz_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "eca19526-18f5-4128-883c-3c439c5ac429",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAAC2CAYAAAB6fF5CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAMhElEQVR4nO3de7BdZXnH8e+TK5wkJkS5aTGMhY5yUZle0lqntqNIqbXQjmAtFrCKxV7GWvpHdUqbUeNMOzhKy1jQapGqQHWkQ3VooZ0QoKAdpkqnlbEJgzRAiJAbOQmEXN7+8b6Bld3sk7MX5DnnkO9nZk/2uryXtfZ7fnvt9+yzEqUUJEk5Zk11ByTpcGLoSlIiQ1eSEhm6kpTI0JWkRIauJCWaktCNiAsi4tZJ7ntxRNx1CPtySOs/VCLiloi46BDU+7MRsSYixiPi3FHaiYgSEScN2TYjz/NkRcTVEXH5VPdjOnPMVnMmu2NEfBj4uVLK2Z11a4C1B1h3eSnlhmF1lVK+DHy5X5f/X79uB75USvmbF6K+6SgiVgAnlVLevW9d95y/wD4KXFVKubIt/8MhamdGiYgfAMcCe4BdwN3ApaWUdQCllEunrnfTj2N2uFGudO8A3hARswEi4nhgLnDGwLqT2r4vOhEx6TepGWwZ8N9T3Ylp6u2llIXA8cAG4K8OdYPPd8w5ZqehUsqkHsA8YAfw4235fOBvgdUD69a254uBzwPrgUeAjwOz27aLgbs6db8V+D6wFfhMq/N93X2BK4DNwIPA2W3bSuqVx9PAOPXdDuDVwG3Aplbv+Z22XgrcDDwJ/DvwsW5fBo75RKAA7wX+F7ijrf8t4P7Wn38GlnXKnNppewPwkbZ+FvDHwAPARuDvgaUD7bwfeLSdsz9q234ReIZ6dTUO3NfW3w68D5gPbAFO6/ThaOAp4Ji2/MvAd9t+dwOvHXK8DwB7W9nxVvft+16LSRx7oV7djHSeZ8ID+AHwls7yLwH/01m+Fvh4e/7zwMPAZcAP2+v5ns6+bwO+087NOmDFRGMO+Cbw+wP9+U/gVx2zM2/MjjrwVgEfas+vagezcmDdF9rzm4BrgAXAMe0gfrttu3jfwQAvawf5a9Tpjg+2F6sburuAS4DZwAfaixzdF7LTxwXUgfyeVt8ZwBPAKW37DW3wLABOo74hHCx0r2v7HwmcA6wFXtPq/xPg7rb/ojb4LgOOaMvL27YPAt8CfqQNjGuA6wfaub61czrwOO2HHFhBnULp9u3Z4wa+AKzsbPtd4J/a8zOoP/jL2/m7iBog8ycZLt12hh77AQbwpM/zTHh0zwswBnwRuK6z/Vr2D93d1I+9c6kBvQM4qrP9dGqovZYadOdOMObOB77daet11BCc55ideWN21IG3AripPb8POJn6rtZddxF17msncGSn7LuAVe35xTwXuhcC93T2C2podkN3bWf7WDtRxw2e4Lb8TuDOgX5fA/xZewF3Aa/ubPvEsBPbGViv6qy7BXhvZ3kW9QdqWTvG7wyp637gzZ3l41tf5nTa6fbrL4DPT3IAvwV4oLPt34AL2/O/Bj42UPb7wJt6DOChx94dwKOe55nwaOdlnHrltYv6xn96Z/u17B+6TwFzOtt/CPz0kLo/DXxqgjF3BPUq7eS2fAXwGcfszByzo3574Q7gjRGxFDi6lLKGeun/hrbutLbPMuo7/PqI2BIRW6jBd8wB6nw5NWQBKPVoHx7Y57HO9h3t6cIhfVwGLN/Xbmv7AuA46keYOd32gIcOdtAD+y8DruzUvYn6RvEK4ATqx51h/bqpU+5+6tTIsUPaeYh6biZjFTAWEcsj4kTg9dRPGvvavWzgfJwwQt2DxzDs2Lv6nufp7txSyhJqCP4esDoijhuy78ZSyu7O8g7amG2v06qIeDwitgKXUj/xdXV/Jp4GbgTeHRGzqEH5dwfpq2P2ubqm1ZgdNXTvoc7VXkJ9Z6KU8iT1Xf8S4NFSyoPUju8EXlZKWdIeLymlnHqAOtdTP74AEBHRXZ6EMrC8DljdaXdJKWVhKeUD1I8/u6kv4D6vHLGNddRpkm79R5ZS7m7bXjWkjnXUuehuuSNKKY909hns16NDjnH/zpWyh/qx6F3t8Y1SyrZOuysH2h0rpVw/ieM+0DEMO/auvud5Riil7CmlfJ0aQG/sUcVXqHOHJ5RSFgNXU4Ngv2YGlr9IvXh4M7CjlHLPwbrZee6YnUZjdqTQLaU8BdwL/CFwZ2fTXW3dHW2/9cCtwCcj4iURMSsifjQi3nSAar8JnN6+XzeHOrcz7OrhQDaw/6D5BvBjEfGbETG3PX4yIl7TXuivAysiYiwiTqFOh4ziauDDEXEqQEQsjojzOm0fHxF/EBHzI2JRRCzvlFsZEctauaMj4pyBui9v/TqVOid9Y+cYT2xXOcN8hTq1ckF7vs/ngEvbFUVExIKIeFtELBrxuA927M96gc7ztNXO4znAUdSrv1EtAjaVUp6OiJ8CfuNgBVrI7gU+ycGvcgc5ZqfRmO3zxxGrqdME3S8N39nWdb8qdiH1Gw/fo85HfY06J7SfUsoTwHnU+aCNwCnUYN85yf5cCbwjIjZHxF+2d8u3Ar9Ofdd9DPhz6i8CoH4sXNjWX0v9BsaklVJuavXdEBFPAv8FnN22bQPOBN7e6l8D/EKnnzcDt0bENuovKJbvXzurqZP+/wpcUUrZ9wckX23/boyI/xjSr28D26kfwW7prL+X+inkKurrsJY6Tz6yiY79AJ7XeZ6m/jEixqm/+F0JXFRK6fNVpd8BPtrGwZ9Sr/gm4zrqL6y+NEpjjtnpNWb3fQNg2mjvjA8DF5RSVk11fzK0Oa0HgbkD84DSsyLiQuD9pZQ+UxovdF9OxDHby7S490JEnBURSyJiPvAR6vzWt6a4W9K0ERFj1Cvkz051X/T8TIvQBX6G+hvUJ6gfc85t88fSYS8izqL+omcD+899agaadtMLkvRiNl2udCXpsGDoSlKiCe9AdOas83rNPcTceb06M2vhgl7l4qjFvcrtWdyvvTJ/9shlYueeXm3N3rq9V7myeWuvcnvHe7a365le5W7b+9XBPwpIsfexk51X0yE167g1BxzbXulKUiJDV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpEQT3vAm5ky4eahZS5f0KvfMKaP8J8DP2fATR/Qqt+N1/e6TfvTSbQffacDjm/r8n3owdl+/m/kce+/SXuXmfe/hXuX2btzUq5x0uPFKV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpESGriQlMnQlKdHEtxGbPbtXpbFgrFe58VfM61Wu793CPrX8xl7lfmXBjpHL3Ly93zn5EO/sVW58/fxe5V76UL9+smVrv3LSYcYrXUlKZOhKUiJDV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpEQT32Vsz55elZbto9+FC2DhI8/0Krf9viN7let7B69PLN02cpnHNy3q1dZYz2Nb+MjTvcr1fe36jhXpcOOVriQlMnQlKZGhK0mJDF1JSmToSlIiQ1eSEhm6kpTI0JWkRIauJCUydCUpkaErSYkMXUlKZOhKUqIJ7zJWdu/uVeneTVt6lZv33V29yr3yocW9yu35lwW9ypX5YyOXWbKz3x3UZm/d3Ktc2by1V7m949v7tddzrEiHG690JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpESGriQlMnQlKZGhK0mJDF1JSmToSlIiQ1eSEk14l7G+yq5+d9Tas7lfOTb3uxNXX7eVr41c5sx4R6+2vHfXoXHWy18/1V2YljLH9ovdbXsPvN4rXUlKZOhKUiJDV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKU6JDc8ObFzht86MXKsX3oeaUrSYkMXUlKZOhKUiJDV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpESGriQlMnQlKZGhK0mJDF1JSmToSlIiQ1eSEhm6kpTI0JWkRIauJCUydCUpkaErSYkMXUlKZOhKUiJDV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpESGriQlMnQlKZGhK0mJDF1JSmToSlIiQ1eSEhm6kpTI0JWkRIauJCUydCUpkaErSYkMXUlKZOhKUiJDV5ISGbqSlMjQlaREhq4kJTJ0JSmRoStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpESGriQlMnQlKZGhK0mJDF1JSmToSlIiQ1eSEhm6kpQoSilT3QdJOmx4pStJiQxdSUpk6EpSIkNXkhIZupKUyNCVpET/B/O+7srHBkxdAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# check the vert_conv\n",
    "show_center_recep_field(inp_img, vert_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "ff0f7ddd-2031-461b-9483-076fd43a4a06",
   "metadata": {},
   "outputs": [],
   "source": [
    "class GatedMaskedConv(nn.Module):\n",
    "\n",
    "    def __init__(self, in_channels, kernel_size=3, dilation=1):\n",
    "        \"\"\"\n",
    "        Gated Convolution block implemented the computation graph shown above.\n",
    "        \"\"\"\n",
    "        super().__init__()\n",
    "        \n",
    "        padding = dilation * (kernel_size - 1) // 2\n",
    "        self.conv_vert = VerticalStackConv(\"B\", in_channels, 2*in_channels, kernel_size, padding=padding,\n",
    "                                          dilation=dilation)\n",
    "        self.conv_horiz = HorizontalStackConv(\"B\", in_channels, 2*in_channels, kernel_size, padding=padding,\n",
    "                                             dilation=dilation)\n",
    "        self.conv_vert_to_horiz = nn.Conv2d(2*in_channels, 2*in_channels, kernel_size=1)\n",
    "        self.conv_horiz_1x1 = nn.Conv2d(in_channels, in_channels, kernel_size=1)\n",
    "\n",
    "    def forward(self, v_stack, h_stack):\n",
    "        # Vertical stack (left)\n",
    "        v_stack_feat = self.conv_vert(v_stack)\n",
    "        v_val, v_gate = v_stack_feat.chunk(2, dim=1)\n",
    "        v_stack_out = torch.tanh(v_val) * torch.sigmoid(v_gate)\n",
    "\n",
    "        # Horizontal stack (right)\n",
    "        h_stack_feat = self.conv_horiz(h_stack)\n",
    "        h_stack_feat = h_stack_feat + self.conv_vert_to_horiz(v_stack_feat)\n",
    "        h_val, h_gate = h_stack_feat.chunk(2, dim=1)\n",
    "        h_stack_feat = torch.tanh(h_val) * torch.sigmoid(h_gate)\n",
    "        h_stack_out = self.conv_horiz_1x1(h_stack_feat)\n",
    "        h_stack_out = h_stack_out + h_stack\n",
    "\n",
    "        return v_stack_out, h_stack_out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "69ce5bfe-da22-43a6-af90-44c47eba47f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# GatedPixelCNN\n",
    "\n",
    "class GatedPixelCNN(nn.Module):\n",
    "    \n",
    "    def __init__(self, in_channels, channels, out_channels):\n",
    "        super().__init__()\n",
    "        \n",
    "        # Initial first conv with mask_type A\n",
    "        self.conv_vstack = VerticalStackConv(\"A\", in_channels, channels, 3, padding=1)\n",
    "        self.conv_hstack = HorizontalStackConv(\"A\", in_channels, channels, 3, padding=1)\n",
    "        # Convolution block of PixelCNN. use dilation instead of \n",
    "        # downscaling used in the encoder-decoder architecture in PixelCNN++\n",
    "        self.conv_layers = nn.ModuleList([\n",
    "            GatedMaskedConv(channels),\n",
    "            GatedMaskedConv(channels, dilation=2),\n",
    "            GatedMaskedConv(channels),\n",
    "            GatedMaskedConv(channels, dilation=4),\n",
    "            GatedMaskedConv(channels),\n",
    "            GatedMaskedConv(channels, dilation=2),\n",
    "            GatedMaskedConv(channels)\n",
    "        ])\n",
    "        \n",
    "        # Output classification convolution (1x1)\n",
    "        self.conv_out = nn.Conv2d(channels, out_channels, kernel_size=1)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # first convolutions\n",
    "        v_stack = self.conv_vstack(x)\n",
    "        h_stack = self.conv_hstack(x)\n",
    "        # Gated Convolutions\n",
    "        for layer in self.conv_layers:\n",
    "            v_stack, h_stack = layer(v_stack, h_stack)\n",
    "        # 1x1 classification convolution\n",
    "        # Apply ELU before 1x1 convolution for non-linearity on residual connection\n",
    "        out = self.conv_out(F.elu(h_stack))\n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "17c7db53-e2fc-4b9d-b303-d0389862dafc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize GaGatedPixelCNN\n",
    "test_model = GatedPixelCNN(1, 64, 1)\n",
    "inp = torch.zeros(1, 1, 28, 28)\n",
    "inp.requires_grad_()\n",
    "out = test_model(inp)\n",
    "show_center_recep_field(inp, out.squeeze(dim=2))\n",
    "del inp, out, test_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "40a71031-9a65-405c-abc6-7e56df1abdda",
   "metadata": {},
   "outputs": [],
   "source": [
    "image_size = 28\n",
    "in_channels = 1\n",
    "out_channels = 1\n",
    "channels = 128 # hidden channels\n",
    "\n",
    "batch_size = 64\n",
    "epochs = 10\n",
    "\n",
    "transform=transforms.Compose([\n",
    "    transforms.ToTensor()\n",
    "])\n",
    "\n",
    "dataset1 = datasets.MNIST('/data', train=True, download=True,\n",
    "                       transform=transform)\n",
    "dataset2 = datasets.MNIST('/data', train=False,\n",
    "                       transform=transform)\n",
    "train_loader = torch.utils.data.DataLoader(dataset1, batch_size=batch_size, shuffle=True)\n",
    "test_loader = torch.utils.data.DataLoader(dataset2, batch_size=batch_size)\n",
    "\n",
    "model = GatedPixelCNN(in_channels, channels, out_channels).cuda()\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=5e-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ed706d53-3ffb-4ad3-adb0-31b91a48ae78",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Start training epoch 0\n",
      "\t [937/938]: loss 0.07492595911026001\n",
      "Start training epoch 1\n",
      "\t [937/938]: loss 0.07849381119012833\n",
      "Start training epoch 2\n",
      "\t [937/938]: loss 0.0740843266248703\n",
      "Start training epoch 3\n",
      "\t [937/938]: loss 0.07141074538230896\n",
      "Start training epoch 4\n",
      "\t [937/938]: loss 0.07250042259693146\n",
      "Start training epoch 5\n",
      "\t [937/938]: loss 0.07237093895673752\n",
      "Start training epoch 6\n",
      "\t [937/938]: loss 0.07213447242975235\n",
      "Start training epoch 7\n",
      "\t [937/938]: loss 0.06828761845827103\n",
      "Start training epoch 8\n",
      "\t [937/938]: loss 0.07389771193265915\n",
      "Start training epoch 9\n",
      "\t [937/938]: loss 0.07310089468955994\n"
     ]
    }
   ],
   "source": [
    "print_freq = 1000\n",
    "for epoch in range(epochs):\n",
    "    print(\"Start training epoch {}\".format(epoch,))\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        images = (images > 0.33).float() # convert to 0, 1\n",
    "        images = images.cuda()\n",
    "        logits = model(images)\n",
    "        loss = F.binary_cross_entropy_with_logits(logits, images)\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        if (i + 1) % print_freq == 0 or (i + 1) == len(train_loader):\n",
    "            print(\"\\t [{}/{}]: loss {}\".format(i, len(train_loader), loss.item())) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2fd9f4f5-251e-4ec0-a750-3a3ba55a8c16",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 64 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## generate new images by PixelCNN\n",
    "n_cols, n_rows = 8, 8\n",
    "C = 1\n",
    "H = 28\n",
    "W = 28\n",
    "\n",
    "# Create an empty array of pixels.\n",
    "pixels = torch.zeros(n_cols * n_rows, C, H, W).cuda()\n",
    "\n",
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    # Iterate over the pixels because generation has to be done sequentially pixel by pixel.\n",
    "    for h in range(H):\n",
    "        for w in range(W):\n",
    "            for c in range(C):\n",
    "                # Feed the whole array and retrieving the pixel value probabilities for the next pixel.\n",
    "                logits = model(pixels)[:, c, h, w]\n",
    "                probs = logits.sigmoid()\n",
    "                # Use the probabilities to pick pixel values and append the values to the image frame.\n",
    "                pixels[:, c, h, w] = torch.bernoulli(probs)\n",
    "                \n",
    "generated_imgs = pixels.cpu().numpy()\n",
    "generated_imgs = np.array(generated_imgs * 255, dtype=np.uint8).reshape(n_rows, n_cols, H, W)\n",
    "    \n",
    "fig = plt.figure(figsize=(8, 8), constrained_layout=True)\n",
    "gs = fig.add_gridspec(n_rows, n_cols)\n",
    "for n_col in range(n_cols):\n",
    "    for n_row in range(n_rows):\n",
    "        f_ax = fig.add_subplot(gs[n_row, n_col])\n",
    "        f_ax.imshow(generated_imgs[n_row, n_col], cmap=\"gray\")\n",
    "        f_ax.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e5aec8e7-5dce-4b83-a9a2-90cf3bf08c90",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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3WhpaYlqD6GoXYQJBALYtm0bDh48GDoENRqNePTRR7FkyZJRfZfH48G7776Lv/3tb7jhhhvwq1/9Cnq9PgqtJlJUVlaG559/fkRXQAVBgNFoHHaPV1FRgWeffRaZmZl47LHHMGfOnCGfsdlseP7553H48GG0trbG722I1tbWQVc3s7Oz0dbWhr6+vlF9T19fH2pra3H8+HHMmjVrSBckr9cLr9cLl8slmf6MZGyCwSBcLhf6+vqgUqmgUqmg1+vHdA4XDAbh8XgGbS8tLS04efIkcnJy4HQ6w/6d1+vF+fPnceLEiTH/O0Yqprchent78eabb2L37t2j+jufz4dDhw6FXeb3+7F9+3bs2rULdXV1kujPSMbObrfj1VdfxUcffYQbbrgBK1asGPOQEFarFW+//fagsULNZrOkTlFiGkCXy4XPPvssot8ZCARw8OBBvPHGG7T3SwB9fX345JNPIJfLkZubi+uvv37M32Wz2fD3v/8dx48fj1wDIywuuqIpFAosWLAApaWluOKKK6BSqdDb24uKigo0NzejqqqKwpdgGGM4fvw4/vKXvyAvLw/l5eVhL5h0dHSgoqICvb29Q5bV19dL/un+uAjgQE+G2267DSqVClqtFmazGS+88AIOHz4sqUMKEhnBYBCffPIJPv/8c1xzzTWYPn162ADW1tbiySefRE1NzZBlgUAA/f39sWjumEk6gGq1Gjk5OTAajcjNzUVqampoWTAYhMPhQHd3N7f2kehyu91wu91ob29HdXV12It358+fh81mG/F2YDAYYDKZUFxcjKSkpEHLHA4HWltbYbFYhr1AE2mSDmBhYSEeeeQRTJ8+HUVFRbybQzg5deoUHnjggbC3FgZCM1KXX3457rvvPmRlZaG4uHjQsmPHjuG5556D1WpFXV3duNs9EpIOYFJSEmbPno25c+fybgrhqKenB8eOHYvId2VkZGDhwoWDjqYG2O12HD16NKbDMkp7SGRCEhwFkBCOJH0IGo7FYkFlZSXq6upiMiArSWzBYBCnT59GTU0NDh06BLfbHdP1x10ADx8+jIcffhh2u516vZBx8/v92LJlC1577TW43e6Yb1OSDKBer0daWhomTZo0aLAc4MKl6dFcdiZEEASkp6dDr9cjIyNjUNc2xhgcDgfa29u5dOaQZACvvvpqrF+/HllZWcjPz+fdHBLnNBoN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\n",
      "text/plain": [
       "<Figure size 216x576 with 24 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# we can use pixelcnn to autocomplete images\n",
    "test_loader_iter = iter(test_loader)\n",
    "images, labels = next(test_loader_iter)\n",
    "\n",
    "n_samples = 8\n",
    "n_rows = 12  # the number of rows to keep\n",
    "\n",
    "images = (images[:n_samples] > 0.33).float() # convert to 0, 1\n",
    "\n",
    "sub_images = images.clone()\n",
    "sub_images[:, :, n_rows:, :] = 0 # mask some pixels\n",
    "pixels = sub_images.cuda()\n",
    "\n",
    "\n",
    "with torch.no_grad():\n",
    "    # Iterate over the pixels because generation has to be done sequentially pixel by pixel.\n",
    "    for h in range(n_rows, H):\n",
    "        for w in range(W):\n",
    "            for c in range(C):\n",
    "                # Feed the whole array and retrieving the pixel value probabilities for the next pixel.\n",
    "                logits = model(pixels)[:, c, h, w]\n",
    "                probs = logits.sigmoid()\n",
    "                # Use the probabilities to pick pixel values and append the values to the image frame.\n",
    "                pixels[:, c, h, w] = torch.bernoulli(probs)\n",
    "                \n",
    "original_imgs = images.cpu().numpy()\n",
    "original_imgs = np.array(original_imgs * 255, dtype=np.uint8).reshape(n_samples, H, W)\n",
    "sub_imgs = sub_images.cpu().numpy()\n",
    "sub_imgs = np.array(sub_imgs * 255, dtype=np.uint8).reshape(n_samples, H, W)\n",
    "generated_imgs = pixels.cpu().numpy()\n",
    "generated_imgs = np.array(generated_imgs * 255, dtype=np.uint8).reshape(n_samples, H, W)\n",
    "\n",
    "\n",
    "fig = plt.figure(figsize=(3, 8), constrained_layout=True)\n",
    "gs = fig.add_gridspec(n_samples, 3)\n",
    "for n_row in range(n_samples):\n",
    "    f_ax = fig.add_subplot(gs[n_row, 0])\n",
    "    f_ax.imshow(original_imgs[n_row], cmap=\"gray\")\n",
    "    f_ax.axis(\"off\")\n",
    "    f_ax = fig.add_subplot(gs[n_row, 1])\n",
    "    f_ax.imshow(sub_imgs[n_row], cmap=\"gray\")\n",
    "    f_ax.axis(\"off\")\n",
    "    f_ax = fig.add_subplot(gs[n_row, 2])\n",
    "    f_ax.imshow(generated_imgs[n_row], cmap=\"gray\")\n",
    "    f_ax.axis(\"off\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
